#define _CRT_SECURE_NO_WARNINGS  // 仅MSVC需要，避免安全函数警告
#define COLOR_PRINT_IMPLEMENTATION
#include "color_print.h"  // 严格遵循你的颜色库引入方式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

// 跨平台所需头文件与函数声明
#ifdef _WIN32
#include <windows.h>  // Windows API（剪贴板、目录获取）
#else
#include <unistd.h>   // Unix-like getcwd
#include <sys/wait.h> // 用于pclose返回值判断
#endif

// -------------------------- 核心工具函数 --------------------------
// 跨平台获取当前工作目录（与原逻辑一致）
static char* get_current_dir(void) {
#ifdef _WIN32
    char* buffer = (char*)malloc(MAX_PATH);
    if (buffer && GetCurrentDirectoryA(MAX_PATH, buffer)) {
        return buffer;
    }
#else
    char* buffer = getcwd(NULL, 0);  // 自动分配缓冲区
    return buffer;
#endif
    free(buffer);
    return NULL;
}

// 跨平台复制文本到剪贴板
static bool copy_to_clipboard(const char* text) {
    if (!text) return false;

#ifdef _WIN32
    // Windows：使用Win32 API（需链接user32.lib）
    if (!OpenClipboard(NULL)) return false;
    if (!EmptyClipboard()) {
        CloseClipboard();
        return false;
    }

    // 分配全局内存存储文本（含终止符）
    size_t text_len = strlen(text);
    HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, text_len + 1);
    if (!hMem) {
        CloseClipboard();
        return false;
    }

    // 复制文本到全局内存
    char* pMem = (char*)GlobalLock(hMem);
    if (pMem) {
        strcpy(pMem, text);
        GlobalUnlock(hMem);
        SetClipboardData(CF_TEXT, hMem); // 移交内存所有权给剪贴板
    } else {
        GlobalFree(hMem);
        hMem = NULL;
    }

    CloseClipboard();
    return hMem != NULL;

#else
    // Unix-like：macOS用pbcopy，Linux用xclip
    const char* cmd;
#ifdef __APPLE__
    cmd = "pbcopy";
#else
    cmd = "xclip -selection clipboard"; // Linux需安装xclip
#endif

    // 打开管道执行命令（参考你的简洁风格）
    FILE* pipe = popen(cmd, "w");
    if (!pipe) return false;

    fputs(text, pipe);
    int ret = pclose(pipe);
    return ret == 0;
#endif
}

// -------------------------- 命令行解析与主逻辑 --------------------------
// 解析参数（严格参考你的 cprintfc 调用方式）
static bool parse_args(int argc, char* argv[]) {
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "--no-color") == 0) {
            // 禁用颜色：按你的用法设置默认黑白
            cprintf_set_default(COL_WHITE, COL_BG_BLACK, COL_NORMAL);
            return false;
        } else if (strcmp(argv[i], "--help") == 0) {
            // 帮助信息：用你的 cprintfc 输出青色
            cprintfc(COL_CYAN, COL_BG_BLACK, COL_NORMAL, "用法: cppwd [选项]\n");
            cprintfc(COL_CYAN, COL_BG_BLACK, COL_NORMAL, "显示当前工作目录并复制到剪贴板\n");
            cprintfc(COL_CYAN, COL_BG_BLACK, COL_NORMAL, "选项:\n");
            cprintfc(COL_CYAN, COL_BG_BLACK, COL_NORMAL, "  --no-color   禁用彩色输出\n");
            cprintfc(COL_CYAN, COL_BG_BLACK, COL_NORMAL, "  --help       显示帮助信息\n");
            exit(0);
        } else {
            // 错误信息：用你的 cprintfc 输出红色/黄色
            cprintfc(COL_RED, COL_BG_BLACK, COL_BOLD, "错误: 未知选项 '%s'\n", argv[i]);
            cprintfc(COL_YELLOW, COL_BG_BLACK, COL_NORMAL, "使用 '--help' 查看帮助\n");
            exit(1);
        }
    }
    return true; // 启用彩色
}

int main(int argc, char* argv[]) {
    // 1. 初始化颜色库（严格遵循你的用法，先初始化）
    color_init();

    // 2. 设置默认颜色（路径用蓝色加粗，参考你的默认设置风格）
    cprintf_set_default(COL_BLUE, COL_BG_BLACK, COL_BOLD);

    // 3. 解析命令行参数
    bool use_color = parse_args(argc, argv);

    // 4. 获取当前工作目录
    char* cwd = get_current_dir();
    if (!cwd) {
        cprintfc(COL_RED, COL_BG_BLACK, COL_BOLD, "错误: 无法获取当前工作目录\n");
        return 1;
    }

    // 5. 输出当前目录（按你的 cprintf/cprintfc 逻辑）
    if (use_color) {
        cprintf("%s\n", cwd); // 用默认蓝色加粗输出
    } else {
        // 禁用颜色时，显式用黑白输出（避免依赖默认值）
        cprintfc(COL_WHITE, COL_BG_BLACK, COL_NORMAL, "%s\n", cwd);
    }

    // 6. 复制到剪贴板并提示结果
    bool copied = copy_to_clipboard(cwd);
    if (copied) {
        cprintfc(COL_CYAN, COL_BG_BLACK, COL_NORMAL, "路径已复制到剪贴板\n");
    } else {
        cprintfc(COL_YELLOW, COL_BG_BLACK, COL_NORMAL, "警告: 无法复制到剪贴板\n");
    }

    // 7. 清理资源
    free(cwd);
    return 0;
}